-----------------------review-------------------------
        三目运算符
        if(today==1){
            console.log("hello")
        }
        else{
            console.log("world")
        }

        表达式 ？value1：value2
        today==1?console.log("hello"):console.log("world");

        一元操作符：
        +：
            +a: 1.如果是number类型——>number 整数
                2.不是number类型——>转换为number类型
        -：
            减号同加号 但取负值
            -a：-a
            -null：-0
            -(-a):将a转换成number类型
        ++： 
            a++ = a=a+1 
                var a=10;
                console.log(a);
                a=a+1; 
            a++；先操作变量，然后进行自增操作
            ++a：进行自增操作，然后操作变量
            var a=10;
            a=a+1;
            console.log(a);
        --：
            a-- = a=a-1 

        位运算：
        使用二进制进行计算
        原码——> 反码——> 补码
        js中：位运算32位2进制
        正数的反码=原码=补码
        负数的反码=原码符号位不变，其他取反
        反码+1=补码

1.数据类型转换
    null和undefined没有转换函数

    string：
        1.*——> string（a）——>"a"
        2.toString():null和undefined没有该方法
        给toString参数 可以进行几进制转化
        3.+""10+""="10" 一个数据类型+一个空字符——>拼接=转换成string

    number：
        *——>number
        1.number(a)
        2.+a 
        3.-(-a)
        4.parseInt
        5.parseFloat

    boolean:
    *——>boolean
    1.boolean(a):true/false
    2.!!a: boolean(a)——>！取反——>！再取反

2.流程控制语句
    1.条件分支语句
        if else
            if(){
            
                //true
            }else{
            
                //false
            }

        switch case:

            key===case 全等比较
        switch(key){
            case1 value1:
            console.log();
            break;
            case2 value2:
            console.log();
            break;
            case3 value3:
            console.log();
            break;
        }
    2.循环语句
    三要素：初始条件 结束条件 迭代条件

        前置条件判断语句
        for(var i=0;i<=5;i++){
            循环体
        }

        开始条件；
        while(结束条件){
            循环体
            迭代条件
        }
    

        后置条件判断语句：循环体至少执行一次
        do{
            循环体
            迭代条件
        }while(结束条件)

        for in 增强for循环

        for（var i in obj）{
            i:obj中的所有属性名
            obj[i]:属性值
        }

        label：
            name：for（）{}
        break：跳出循环
        continue：跳出本次循环执行下一次循环

        限制循环作用域
        with(o){
            console.log(name)
        }
    
    3.对象
    object类型中的直接实例：是一组属性和方法的集合
        1.创建
            对象字面量 var o={
                name:"zhangsan",
                age:20 
                <!-- 我们赋予的是私有属性 toString/valueOf/constructor是继承属性（能调用但是调用的父辈属性） -->
            }
            构造函数 
            var o=new Object();
            o.name="zhangsan"

        2.访问
            点操作符
                o.变量名称
            []操作符
                o.["变量名称"]
                o[key]:key变量
            
        3.删除 
            delete o.name 
            delete 0[key]

        4.检测属性
            in：检测当前属性是否为对象的私有/继承属性，如果不是，返回false
            hasOwnProperty（）：检测某个属性是否是对象的私有属性

        5.对象序列化
            json
              JSON.parse():将json字符串类型转换成对象
              JSON.string

        6.构造函数和原型对象
            所有的函数都有一个原型对象
            所有的对象都有一个constructor属性
            prototype:指向原型对象
            constructor：指向构造函数
            静态属性/方法：
                声明在函数本身内部，只有函数本身调用
                assign (a,b):将b对象合并到a对象中
                调用：object.assign

                Object.keys():当前对象所有属性名所组成的一个数组
                Object.values():当前对象所有属性值所组成的一个数组
                Object.defineproperty():定义属性
            非静态属性/方法：
                声明在函数的原型对象，所有实例对象均可调用
                constructor
                toString()
                valueOf
                hasOwnProperty 

                eg:
                Object.prototype.constructor
                new Object().constructor

        7.Object.defineProperty(obj.key{})
            
            定义属性
            {}:基本属性描述：value（给当前key设置属性值）；
                            writable：（是否可写 默认false）
                            enumberable：（是否可遍历  默认false）
                            configurable：（是否可删除/可配置  默认false）


                            存取操作符
                                不能和value同时使用
                            set:function
                            get:function

    4.函数
        function say(){}
        number()
        new Object()

        在js中，所有函数的内部构造是一致的。
        普通函数
        构造函数：函数调用方法不同
                 构造函数首字母大写
        解析顺序：先解析函数的声明，在解析var操作变量但不赋值
            1.创建
                1.函数字面量
                    var say=function(){}  赋名前为匿名函数
                2.函数的声明
                    function say(){}
                3.匿名函数
                    function(){}
                    需要立即执行不然找不到
                   ( function(){}){}
            2.调用
                函数名(参数)
                new 函数名():一般new调用的函数为构造函数

            3.函数的参数
                形参：形式参数
                实参：实际参数
                function say(a,b){
                    console.log(a+b)
                }

                在js中 形参个数可以和实参个数不一致：弱类型语言的松散型

                js中 没有重载概念 只要函数名相同即为重写

            4.函数的内部属性
                arguments：类数组对象;
                    用来保存实参的
                    length：实参个数
                    callee：从函数内部指向当前函数
                
                this:是函数赖以生存的环境对象
                    this指向谁：谁调用当前拥有this的函数，this就指向谁